/**
 * Created By xiyuan
 * Author server@xiyuan.name (惜缘叛逆)
 * DateTime 2020/9/1 1:52 PM
 * Describe javascript功能描述
 * MIT License http://www.opensource.org/licenses/mit-license.php
 */

// 文件处理
const fs = require('fs');
// 路径处理
const path = require('path');

/**
 * 文件迭代
 * @param files
 * @param successe
 * @param error
 * @param whiteList
 * @returns {*}
 */
export function fileIteration(files, successe, error, whiteList) {
	// 兼容文件列表
	files = Array.isArray(files) ? files : [files];
	let pathname = files.shift();
	if (!pathname) return error('文件读取完毕', 2);
	// 读取文件信息
	fs.stat(pathname, (err, stats) => {
		if (err) {
			// 继续迭代
			fileIteration(files, successe, error, whiteList);
			return error('获取文件stats失败', pathname, 0)
		}
		// 检查是否目录
		if (stats.isDirectory()) {
			// 读取目录下的文件
			fs.readdir(pathname, function (err, fileList) {
				if (err) {
					console.error(err)
					// 继续迭代
					fileIteration(files, successe, error, whiteList);
					return
				}
				// 收集文件地址
				files.push(...fileList.map(filePath => path.join(pathname, filePath)));
				// 继续迭代
				fileIteration(files, successe, error, whiteList);
			});
			
		} else if (stats.isFile()) {
			// 文件后缀
			const extname = path.extname(pathname)
			// 文件白名单过滤
			if (!whiteList.some(function (rules) {
				switch (typeof rules) {
					case "function":
						return rules(pathname, extname);
						break;
					case "string":
						return extname == rules;
						break;
				}
			})) {
				// 继续迭代
				fileIteration(files, successe, error, whiteList);
				return //error('文件不在白名单内', pathname, 1)
			}
			// 文件路径返回
			successe && successe(pathname, function (isNext) {
				// 是否继续
				if (isNext) {
					// 继续迭代
					fileIteration(files, successe, error, whiteList);
				} else {
					return error('文件读取完毕', 2);
				}
			})
		}
	});
	
}
